<?php

namespace app\helpers;

use Yii;
/**
 * Class Https
 */
class HttpsHelper
{
    /**
     * https 发起post请求
     *
     * @param string $url url信息
     * @param mixed $data 参数信息[$data = '{"a":1,"b":2}' or $data = array("a" => 1,"b" => 2)]
     * @param int $timeOut 超时设置
     * @param string $proxyHost 代理host
     * @param int $proxyPort 代理端口
     * @return string
     */
    public static function post($url, $data = null,$timeOut = 20, $proxyHost = null, $proxyPort = null)
    {
        try {
            if (strlen($url) < 1) {
                return null;
            }

            $ch = curl_init();

            // 设置url
            curl_setopt($ch, CURLOPT_URL, $url);

            if(false == empty($data))
            {
                curl_setopt($ch, CURLOPT_POST, 1);
                // array
                if (is_array($data) && count($data) > 0)
                {
                    curl_setopt($ch, CURLOPT_POST, count($data));
                }
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            }

            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

            // 如果成功只将结果返回，不自动输出返回的内容
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            // user-agent
            curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0");
            // 超时
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeOut);

            // 使用代理
            if (strlen($proxyHost) > 0 && strlen($proxyPort) > 0) {
                // 代理认证模式
                curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
                // 代理服务器地址
                curl_setopt($ch, CURLOPT_PROXY, $proxyHost);
                // 代理服务器端口
                curl_setopt($ch, CURLOPT_PROXYPORT, $proxyPort);
                // 使用http代理模式
                curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
            }

            // 执行
            $out = curl_exec($ch);
            // 关闭
            curl_close($ch);
            return $out;
        } catch ( Exception $e ) {
            return null;
        }

        return null;
    }

    /**
     * https 发起post多发请求
     *
     * @param array $nodes url和参数信息。
     * $nodes = array
     * (
     *      [0] = > array
     *          (
     *              'url' => 'http://www.baidu.com',
     *              'data' => '{"a":1,"b":2}'
     *          ),
     *      [1] = > array
     *          (
     *              'url' => 'http://www.baidu.com',
     *              'data' => null
     *          )
     *      ....
     * )
     * @param int $timeOut 超时设置
     * @return array
     */
    public static function postMulti($nodes,$timeOut = 5)
    {
        try
        {
            if (false == is_array($nodes))
            {
                return array();
            }

            $mh = curl_multi_init();
            $curlArray = array();
            foreach($nodes as $key => $info)
            {
                if(false == is_array($info))
                {
                    continue;
                }
                if(false == isset($info['url']))
                {
                    continue;
                }

                $ch = curl_init();
                // 设置url
                $url = $info['url'];
                curl_setopt($ch, CURLOPT_URL, $url);

                $data = isset($info['data']) ? $info['data'] :null;
                if(false == empty($data))
                {
                    curl_setopt($ch, CURLOPT_POST, 1);
                    // array
                    if (is_array($data) && count($data) > 0)
                    {
                        curl_setopt($ch, CURLOPT_POST, count($data));
                    }
                    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                }

                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
                // 如果成功只将结果返回，不自动输出返回的内容
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                // user-agent
                curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0");
                // 超时
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeOut);

                $curlArray[$key] = $ch;
                curl_multi_add_handle($mh, $curlArray[$key]);
            }

            $running = NULL;
            do {
                usleep(10000);
                curl_multi_exec($mh,$running);
            } while($running > 0);

            $res = array();
            foreach($nodes as $key => $info)
            {
                $res[$key] = curl_multi_getcontent($curlArray[$key]);
            }
            foreach($nodes as $key => $info){
                curl_multi_remove_handle($mh, $curlArray[$key]);
            }
            curl_multi_close($mh);
            return $res;
        }
        catch ( Exception $e )
        {
            return array();
        }

        return array();
    }

}
